ADOQuery prebirani parameters z DataSource.

Otázka od: David Michal

13. 11. 2002 16:31

Zdravim,
Delphi6, ADO, MSSQL2000.

V programu mam toto:
With Q_Temp1 do //componenta TADOQuery
 begin
  Close;
  Sql.Clear;
  Sql.Add('Select ID_Company From Company Where Name = ''Name'' ');
  Open;
 end;

With Q_Temp2 do //componenta TAdoQuery
 begin
  Close;
  Sql.Clear;
  Sql.Add('Select Person From People Where ID_Company = :ID_Company');
  DataSource := DS_Temp1; //DS_Temp1 je komponenta TDataSource s datasetem
Q_Temp1
  Open;
 end;
//vim ze by to slo resit jednim SQL prikazem, tato ukazka je zde pouze pro
predstaveni meho problemu

pak s tim nejak pracuji a nakonec davam:
Q_Temp2.DataSource := nil;
Q_Temp2.Close;
Q_Temp1.Close;

A nyni k problemu, pokud to takto spustim tak vse krasne funguje az do doby
dokud nezmenim SQL.Text u obou komponent.
Pokud se v novem SQL.Text nachazeji jina jmena parametru pak mi to hodi
chybovou hlasku, ze nenalezl parametr ID_Company.
Zkousel jsem pouzit Parameters.ParseSQl(Sql.Text, True), ale to nepomohlo.
Mate nekdo nejaky napad? Vypada to, ze jsem nekde opomnel vyresetovat seznam
parameters, ale nevim kde a jak presne to udelat.
Diky,
David Michal
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.417 / Virus Database: 233 - Release Date: 08/11/2002

Odpovedá: tuffi@email.cz

13. 11. 2002 17:20

Nestacilo by dat Unprepare / Prepare? Pripadne ho(parametr) tam dohodit ruco? :-
)

--- Původní zpráva ---
Od: "David Michal" <david.michal@www-bv.com>
Datum: 13.11.2002 15:59:21

Zdravim,
Delphi6, ADO, MSSQL2000.

A nyni k problemu, pokud to takto spustim tak vse krasne funguje az do doby
dokud nezmenim SQL.Text u obou komponent.
Pokud se v novem SQL.Text nachazeji jina jmena parametru pak mi to hodi
chybovou hlasku, ze nenalezl parametr ID_Company.
Zkousel jsem pouzit Parameters.ParseSQl(Sql.Text, True), ale to nepomohlo.
Mate nekdo nejaky napad? Vypada to, ze jsem nekde opomnel vyresetovat seznam
parameters, ale nevim kde a jak presne to udelat.
Diky,
David Michal
---


______________________________________________________________________________
Email.cz -----> Vaše emailová schránka zdarma.
http://www.Email.cz <------------Pošta zdarma!

Odpovedá: David Michal

14. 11. 2002 11:29

Zdravim,
To by nestacilo. TADOQuery nema metodu unprepare. Ale i kdyz bych pred
zmenou sql.text nastavil Prepared := False, tak to nicemu nepomuze. A rucne
ho zadat nemohu, jelikoz to takto pouzivam pro vystup do sestavy se
Subdetails.
David

-----Original Message-----
From: delphi-l-owner@clexpert.cz [mailto:delphi-l-owner@clexpert.cz]On
Behalf Of tuffi@email.cz
Sent: 13 November 2002 17:12
To: delphi-l@clexpert.cz
Subject: Re: ADOQuery prebirani parameters z DataSource.


Nestacilo by dat Unprepare / Prepare? Pripadne ho(parametr) tam dohodit
ruco?  

--- Původní zpráva ---
Od: "David Michal" <david.michal@www-bv.com>
Datum: 13.11.2002 15:59:21

Zdravim,
Delphi6, ADO, MSSQL2000.

A nyni k problemu, pokud to takto spustim tak vse krasne funguje az do doby
dokud nezmenim SQL.Text u obou komponent.
Pokud se v novem SQL.Text nachazeji jina jmena parametru pak mi to hodi
chybovou hlasku, ze nenalezl parametr ID_Company.
Zkousel jsem pouzit Parameters.ParseSQl(Sql.Text, True), ale to nepomohlo.
Mate nekdo nejaky napad? Vypada to, ze jsem nekde opomnel vyresetovat seznam
parameters, ale nevim kde a jak presne to udelat.
Diky,
David Michal

---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.419 / Virus Database: 235 - Release Date: 13/11/2002

Odpovedá: Lstiburek Pavel

14. 11. 2002 14:24

Ahoj,
sam prikazy s ":" notaci parametru nepozivam, davam prednost
ulozenym proceduram (kdyz uz v serveru jsou), ale
nedalo mi to. Toto je postup, ktery urcite vede k cili
(neco jde asi vyhodit -> nutno vyzkouset):

type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    DataSource1: TDataSource;
    DataSource2: TDataSource;
    DBGrid1: TDBGrid;
    DBGrid2: TDBGrid;
    Button1: TButton;
    ADOQuery2: TADOQuery;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOQuery2.Close;
  ADOQuery1.Close;
  //zmena masteru i detailu
  ADOQuery1.SQL.Text := 'SELECT * FROM Ucet';
  ADOQuery2.SQL.Text :=
'SELECT * FROM Smlouva WHERE CisloSmlouvy
=:CisloSmlouvy';
  //natazeni parametru
  ADOQuery2.Parameters.Clear;
  //nastaveni udaju o prametru (vim, ze jen jeden)
  ADOQuery2.Parameters.ParseSQL(ADOQuery2.SQL.Text, True);
  ADOQuery2.Parameters[0].DataType := ftString;
  ADOQuery2.Parameters[0].Attributes := [];
  ADOQuery2.Parameters[0].Direction := pdInput;
  ADOQuery2.Parameters[0].NumericScale := 255;
  ADOQuery2.Parameters[0].Precision := 255;
  ADOQuery2.Parameters[0].Size := 10;
  ADOQuery2.Parameters[0].Value := NULL;
  //ShowMessage( ADOQuery2.Parameters[0].Name);
  ADOQuery1.Open;
  ADOQuery2.Open;
end;

Pavel

---
A nyni k problemu, pokud to takto spustim tak vse krasne funguje az do doby
dokud nezmenim SQL.Text u obou komponent.
Pokud se v novem SQL.Text nachazeji jina jmena parametru pak mi to hodi
chybovou hlasku, ze nenalezl parametr ID_Company.
Zkousel jsem pouzit Parameters.ParseSQl(Sql.Text, True), ale to nepomohlo.
Mate nekdo nejaky napad? Vypada to, ze jsem nekde opomnel vyresetovat seznam
parameters, ale nevim kde a jak presne to udelat.

Odpovedá: David Michal

14. 11. 2002 16:37

Zdravim,
Tak ani takto to neprojde. Takto to funguje pokud mam stale stejny Sql.Text
v obou Queries. Jakmile tento text zmenim a budu chtit jine parametry, tak
mi program hodi chybovou hlasku s tim, ze nemuze najit parametr. V tomto
pripade napise ze nemuze najit CisloSmlouvy. Pokud Sql.Text nememin tak vse
funguje tak jak ma.
David

Ahoj,
sam prikazy s ":" notaci parametru nepozivam, davam prednost
ulozenym proceduram (kdyz uz v serveru jsou), ale
nedalo mi to. Toto je postup, ktery urcite vede k cili
(neco jde asi vyhodit -> nutno vyzkouset):

procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOQuery2.Close;
  ADOQuery1.Close;
  //zmena masteru i detailu
  ADOQuery1.SQL.Text := 'SELECT * FROM Ucet';
  ADOQuery2.SQL.Text :=
'SELECT * FROM Smlouva WHERE CisloSmlouvy
=:CisloSmlouvy';
  //natazeni parametru
  ADOQuery2.Parameters.Clear;
  //nastaveni udaju o prametru (vim, ze jen jeden)
  ADOQuery2.Parameters.ParseSQL(ADOQuery2.SQL.Text, True);
  ADOQuery2.Parameters[0].DataType := ftString;
  ADOQuery2.Parameters[0].Attributes := [];
  ADOQuery2.Parameters[0].Direction := pdInput;
  ADOQuery2.Parameters[0].NumericScale := 255;
  ADOQuery2.Parameters[0].Precision := 255;
  ADOQuery2.Parameters[0].Size := 10;
  ADOQuery2.Parameters[0].Value := NULL;
  //ShowMessage( ADOQuery2.Parameters[0].Name);
  ADOQuery1.Open;
  ADOQuery2.Open;
end;

Pavel

---
A nyni k problemu, pokud to takto spustim tak vse krasne funguje az do doby
dokud nezmenim SQL.Text u obou komponent.
Pokud se v novem SQL.Text nachazeji jina jmena parametru pak mi to hodi
chybovou hlasku, ze nenalezl parametr ID_Company.
Zkousel jsem pouzit Parameters.ParseSQl(Sql.Text, True), ale to nepomohlo.
Mate nekdo nejaky napad? Vypada to, ze jsem nekde opomnel vyresetovat seznam
parameters, ale nevim kde a jak presne to udelat.


---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.419 / Virus Database: 235 - Release Date: 13/11/2002

Odpovedá: Lstiburek Pavel

14. 11. 2002 18:59

Co to je stale stejny SQL.Text ? V prikladu jsem zmenil oba sql prikazy
a maji ruzny i parametr :"bleble". To ze nemuze najit CisloSmlouvy je OK,
to je prave jmeno toho parametru !
Je to nutno napsat tak, aby ADOQuery1 melo v result setu sloupec se stejnym
nazvem (nazvy) jako je (jsou) parametr(y) v ADOQuery2 !
tj. to co je za "=:". Jinak master detail nepracuje !

  // vymazani stavajiciho seznamu parametru
  ADOQuery2.Parameters.Clear;
  // nalezeni novych a vytvoreni jejich seznamu
  ADOQuery2.Parameters.ParseSQL(ADOQuery2.SQL.Text, True);
  //nastaveni vlastnosti parametru --> nutno upravit dle skutecnosti !
  // nejjednoduseji vytazenim z ADOQuery1 -> musi obsahovat
  // sloupce se s nazvem shodnym s nazvem parametru
  // v prikladu je to "natvrdo" je to priklad
  //
  // nejlepe v cyklu pres vsechny parametry
  ADOQuery2.Parameters[0].DataType :=
     ADOQuery1.FieldByName(ADOQuery2.Parameters[0].Name).DataType;
  ADOQuery2.Parameters[0].Attributes := [];
  ADOQuery2.Parameters[0].Direction := pdInput;
  ADOQuery2.Parameters[0].NumericScale := 255;
  ADOQuery2.Parameters[0].Precision := 255;
  ADOQuery2.Parameters[0].Size :=
      ADOQuery1.FieldByName(ADOQuery2.Parameters[0].Name).Size;
  ADOQuery2.Parameters[0].Value := NULL;

ParseSQL(ADOQuery2.SQL.Text, True) bylo v poradku,
ale je nutno doplnit jeste properties jednotlivych parametru.

Pavel

PS: Jestli chces poslu ti ten priklad cely na soukromy mail (i daty).

Odpovedá: Erik Salaj

14. 11. 2002 19:53

> A nyni k problemu, pokud to takto spustim tak vse krasne funguje az do
doby
> dokud nezmenim SQL.Text u obou komponent.
> Pokud se v novem SQL.Text nachazeji jina jmena parametru pak mi to hodi
> chybovou hlasku, ze nenalezl parametr ID_Company.
> Zkousel jsem pouzit Parameters.ParseSQl(Sql.Text, True), ale to nepomohlo.
> Mate nekdo nejaky napad? Vypada to, ze jsem nekde opomnel vyresetovat
seznam
> parameters, ale nevim kde a jak presne to udelat.

zda sa, ze je to chyba vo VCL, detail dataset musi byt otvoreny pred master
datasetom, aby to fungovalo, ale potom znova zatvoreny a otvoreny aby
zohladnil hodnotu v master query. Takze tu je workaground, ktory som nasiel:

  ADOQuery1.SQL.Text :=
'SELECT ID_Company FROM Company WHERE Name =
''WINSOFT''';
  ADOQuery2.SQL.Text :=
'SELECT ForeName FROM People WHERE ID_Company =
:ID_Company';
  ADOQuery2.Open;
  ADOQuery1.Open;

  // reopen detail query
  ADOQuery2.Close;
  ADOQuery2.Open;

Erik

Odpovedá: Erik Salaj

14. 11. 2002 23:22

> A nyni k problemu, pokud to takto spustim tak vse krasne funguje az do
doby
> dokud nezmenim SQL.Text u obou komponent.
> Pokud se v novem SQL.Text nachazeji jina jmena parametru pak mi to hodi
> chybovou hlasku, ze nenalezl parametr ID_Company.
> Zkousel jsem pouzit Parameters.ParseSQl(Sql.Text, True), ale to nepomohlo.
> Mate nekdo nejaky napad? Vypada to, ze jsem nekde opomnel vyresetovat
seznam
> parameters, ale nevim kde a jak presne to udelat.

este jedna poznamka: v Adonise sa tento problem nevyskytuje, funguje to tam
korektne,
treba len nastavit typ parametra na ptInput:

  ADOQuery1.SQL.Text :=
'SELECT ID_Company FROM Company WHERE Name =
''WINSOFT''';
  ADOQuery1.Open;

  ADOQuery2.SQL.Text :=
'SELECT ForeName FROM People WHERE ID_Company =
:ID_Company';
  ADOQuery2.Params[0].ParamType := ptInput;
  ADOQuery2.Open;

Erik